/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Mercado.model;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author rafael
 */
public class Estoque_abstract {
    private List<Produto> produtos;
    private List<Float> qtdItens;
    private int totalItens, totalProdutos;
    
    /**
     * Cria estoque.
     * Inicializa atributos do estoque.
     **/
    public Estoque_abstract(){
        limpaDados();
        //carregaEstoque();
    }

    /**
     * @return o total de ítens no estoque
     */
    public int getTotalItens() {
        return totalItens;
    }

    /**
     * @return o total de tipos diferentes de itens no estoque.
     */
    public int getTotalTipos() {
        return totalProdutos;
    }
    
    /**
     * Adiciona um produto novo ao estoque.
     * Se o produto já existir, adiciona a quantidade usando adicionaProdutoQtd.
     * @param p
     * @param qtd 
     */
    public void adicionaProduto(Produto p, float qtd){
        if (isCadastrado(p)){
            adicionaProdutoQtd(p.getCodigo(), qtd);
        }
        else{
            produtos.add(p);
            qtdItens.add(qtd);
            totalItens += qtd;
            totalProdutos++;
            ordenaProdutos();
        }
    }
    
    /**
     * Adiciona uma quantia de itens ao estoque do Produto.
     * @param cod Código do produto
     * @param qtd Quantidade de itens a serem adicionados.
     */
    public void adicionaProdutoQtd(int cod, float qtd){
        int pos = getPosItem(cod);
        if(pos!=-1){
            qtdItens.set(pos, qtdItens.get(pos)+qtd);
            totalItens += qtd;
        }
        else{
            System.out.println("Item não encontrado!");
        }
    }
    
    public Produto getProduto(int cod){
        int i = getPosItem(cod);
        if(i!=-1)
            return produtos.get(i);
        else
            return null;
    }
    
    /**
     * Remove uma quantidade do estoque referente a um item. Se o valor
     * informado for maior ou igual ao disponibilizado em estoque, perguntará se
     * deseja remover todos os itens do estoque, usando a função removeItem.
     * @param cod Código do item a ter o total em estoque diminuído.
     * @param q Quantidade a remover do item informado.
     */
    public boolean removeItemQtd(int cod, float q){
        int pos = getPosItem(cod);
        if (pos>=0){
            float qtd = this.qtdItens.get(pos);
            if (q<=qtd){
                this.qtdItens.set(pos, qtd-q);
                this.totalItens -= q;
                return true;
            }
            else{
                System.err.println("Quantidade superior à do estoque.");
                return false;
            }
        }
        else{
            System.err.println("Item não encontrado.");
            return false;
        }
    }
    
    /**
     * 
     * @param cod 
     */
    public boolean removeItem(int cod){
        int pos = getPosItem(cod);
        if (pos>=0){
            float qtd = qtdItens.get(pos);
            produtos.remove(pos);
            qtdItens.remove(pos);
            totalItens -= qtd;
            totalProdutos--;
            return true;
        }
        else
            return false;
    }
    
    public List<Produto> getProdutos(){
        return produtos;
    }
    
    public List<Float> getQtdItens(){
        return qtdItens;
    }
    
    private void ordenaProdutos(){
        int i, larg = produtos.size()-1, swt;
        float swapQtd;
        Produto swapP;
        while(true){
            swt = 0;
            for (i=0;i<larg;i++)
                if (produtos.get(i).getCodigo()>produtos.get(i+1).getCodigo()){
                    swapP = produtos.get(i);
                    swapQtd = qtdItens.get(i);
                    produtos.set(i, produtos.get(i+1));
                    qtdItens.set(i, qtdItens.get(i+1));
                    produtos.set(i+1, swapP);
                    qtdItens.set(i+1, swapQtd);
                    swt++;
                }
            larg--;
            if (swt==0)
                break;
        }
    }
    
    /**
     * 
     * @param cod
     * @return 
     */
    private int getPosItem(int cod){
        int i=0;
        for (Produto item : this.produtos) {
            if (item.getCodigo() == cod){
                return i;
            }
            i++;
        }
        return -1;
    }
    
    /**
     * 
     * @param p
     * @return 
     */
    public boolean isCadastrado(Produto p){
        int cod = p.getCodigo();
        for(Produto pro : produtos){
            if (cod==pro.getCodigo()){
                return true;
            }
        }
        return false;
    }
    
    public void limpaDados(){
        this.produtos = new ArrayList<>();
        this.qtdItens = new ArrayList<>();
        this.totalProdutos = 0;
        this.totalItens = 0;
    }
}
